#include <iostream>

using namespace std;

/*
 * 菱形继承(钻石继承)
 *      两个派生类继承一个父类，同时又有一个子类同时继承这两个派生类
 *          问题  1、子类使用父类的数据时，会产生二义性
 *               2、子类继承自父类的数据只需要一份即可
 *
 *  利用虚继承解决菱形继承的问题
 *          虚继承后，子类中的数据只有一份，不会产生二义性
 *                  派生类中的成员属性为 vbptr (virtual base pointer) 指向vbtable中成员属性的地址
 */

class Animal
{
public:
    int m_Age;
};

class Sheep: virtual public Animal{};  // 使用virtual修饰继承(虚继承)将Animal类变为虚基类

class Camel: virtual public Animal{};

class Alpaca: public Sheep, public Camel{};

void test01()
{
    Alpaca alpaca;
    alpaca.Sheep::m_Age = 18;
    alpaca.Camel::m_Age = 28;
    cout << "alpaca.Sheep::m_Age=" << alpaca.Sheep::m_Age << endl;
    cout << "alpaca.Camel::m_Age=" << alpaca.Camel::m_Age << endl;


    cout << "alpaca.m_Age=" << alpaca.m_Age << endl;  // virtual修饰之后此处不会报告二义性
}

int main() {

    test01();

    return 0;
}
